// @Title  请填写文件名称（需要改）
// @Description  请填写文件描述（需要改）
// @Author  请填写自己的真是姓名（需要改）  2021/4/26 21:37
// @Update  请填写自己的真是姓名（需要改）  2021/4/26 21:37
package api

import (
	"fmt"
	. "gin_example/global"
	"gin_example/middleware"
	"gin_example/middleware/valid"
	"gin_example/model/webmodel"
	"gin_example/model/webmodel/request"
	"github.com/gin-gonic/gin"
	"net/http"
)

func InitUserRouter(router *gin.Engine) {

	group := router.Group("/user")
	// 分组级别的拦截
	group.Use(middleware.LoginIntercepter)

	//路径参数
	group.GET("/:id", middleware.FuncAuthIntercepter("func-id"), func(c *gin.Context) {
		Logger.Info("**********************")
		//获取原生的对象
		//httpReq := c.Request
		//gin.ResponseWriter 继承了http.ResponseWriter
		//httpWriter := c.Writer

		id := c.Param("id")
		//c.String(http.StatusOK, "user id = "+id)
		c.JSON(http.StatusOK, webmodel.RespData{
			Code: webmodel.CodeSucess,
			Msg:  "user id = " + id,
		})
	})

	//get参数
	group.GET("/welcome", func(c *gin.Context) {
		firstname := c.DefaultQuery("firstname", "Guest")
		lastname := c.Query("lastname") // 是 c.Request.URL.Query().Get("lastname") 的简写

		//c.String(http.StatusOK, "Hello %s %s", firstname, lastname)
		c.JSON(http.StatusOK, webmodel.RespData{
			Code: webmodel.CodeSucess,
			Msg:  fmt.Sprintf("Hello %s %s", firstname, lastname),
		})
	})

	//模型绑定
	group.POST("/welcome2", middleware.FuncAuthIntercepter("func-welcome2"), func(c *gin.Context) {
		/*
			Must bind
			Methods - Bind, BindJSON, BindXML, BindQuery, BindYAML
			Behavior - 这些方法底层使用 MustBindWith，如果存在绑定错误，请求将被以下指令中止 c.AbortWithError(400, err).SetType(ErrorTypeBind)，
			响应状态代码会被设置为400，请求头Content-Type被设置为text/plain; charset=utf-8。注意，如果你试图在此之后设置响应代码，
			将会发出一个警告 [GIN-debug] [WARNING] Headers were already written. Wanted to override status code 400 with 422，
			如果你希望更好地控制行为，请使用ShouldBind相关的方法

			Should bind
			Methods - ShouldBind, ShouldBindJSON, ShouldBindXML, ShouldBindQuery, ShouldBindYAML
			Behavior - 这些方法底层使用 ShouldBindWith，如果存在绑定错误，则返回错误，开发人员可以正确处理请求和错误。
		*/

		/*
			1. ShouldBind 必须传指针
			2. User中字段必须大写开头
			3. 字段名与参数不同则需要用tag指定参数名
		*/

		var user = request.User{}

		//绑定并验证
		err := c.ShouldBind(&user)
		Logger.Info("-------------" + user.ToString())
		if nil != err {
			c.JSON(http.StatusOK, webmodel.RespData{
				Code: webmodel.CodeFailed,
				Msg:  valid.TransValidateErr(err),
			})
			return

		}

		//c.String(http.StatusOK, "Hello %s %s", user.ToString())
		c.JSON(http.StatusOK, webmodel.RespData{
			Code: webmodel.CodeSucess,
			Data: user,
		})
	})

	group.GET("/panic", func(c *gin.Context) {
		panic("---$$$$$$$$$$------------panic ---------------")
	})

	group.GET("/download", func(c *gin.Context) {
		//fmt.Sprintf("attachment; filename=%s", filename)对下载的文件重命名
		filename := "aaa.txt"
		c.Writer.Header().Add("Content-Disposition", fmt.Sprintf("attachment; filename=%s", filename))
		c.Writer.Header().Add("Content-Type", "application/octet-stream")
		c.File("./file/a.txt")
	})

	group.GET("/upload", func(ctx *gin.Context) {
		form, _ := ctx.MultipartForm()
		//form.Value
		files := form.File["upload[]"]
		for _, file := range files {
			fmt.Println(file.Filename)
			ctx.SaveUploadedFile(file, "./file/"+file.Filename) // 文件夹需要向创建
		}
	})

}
